home *** CD-ROM | disk | FTP | other *** search
/ Night Owl 8 / Night Owl CD-ROM (NOPV8) (Night Owl Publisher) (1993).ISO / 034a / aecur101.arj / CONTRIB / CURSES / SRC / CURSES.C < prev    next >
C/C++ Source or Header  |  1991-11-05  |  6KB  |  281 lines

  1. /*----------------------------------------------------------------------
  2.  *
  3.  *  curses.c
  4.  *
  5.  *  copyright (c) 1987,88,89,90 J. Alan Eldridge
  6.  *
  7.  *  main module for Curses! v. 3.X
  8.  *  
  9.  *----------------------------------------------------------------------
  10.  */
  11.  
  12. #include <stdarg.h>
  13.  
  14. #include "curses.h"
  15.  
  16. #ifndef __GNUC__
  17. #define GET_TTY_FROM_ENV    1   /* read env. var for video options */
  18. #else
  19. #define GET_TTY_FROM_ENV    0   /* don't read env. var for video options */
  20. #endif
  21.  
  22. /* GLOBAL VARS */
  23.  
  24. WINDOW  *stdscr             =   NULL,   /* default window */
  25.         *curscr             =   NULL;   /* screen image window */
  26.  
  27. int     LINES               =   25,     /* # rows on physical screen */
  28.         COLS                =   80;     /* # cols on physical screen */
  29.  
  30. int     __USE_BIOS          =   0;      /* don't use BIOS */
  31.  
  32. int     __DEFNORM           =   VID_DEFNORM,  /* default "normal" attribute */
  33.         __DEFSTAND          =   VID_DEFSTAND, /* default "standout" attribute */
  34.         __DEFBRIGHT         =   VID_DEFBRIGHT,/* default "bright" attribute */
  35.         __VIDMODE           =   VID_COLOR_80x25;    /* BIOS video mode */
  36.  
  37. MACHINE_ID      __MACHID    =   { 0xff, 0x00 };
  38.  
  39. FAR_PTR_UNION  __VIDADDR    =   { 0xb8000000L };
  40.  
  41. /* STATIC VARS */
  42.  
  43. static int  nlflag      =   1,  /* newline mapping toggle (don't turn off!) */
  44.             echoflag    =   0,  /* echo toggle (don't turn on!) */
  45.             rawflag     =   0,  /* raw i/o toggle (don't turn on!) */
  46.             machid_set  =   0;  /* did user set machine type explicitly? */
  47.             
  48. /*  TTY CONTROL FUNCTIONS */
  49.  
  50. void
  51. set_machine_id(id_ptr)
  52. MACHINE_ID  *id_ptr;
  53. {
  54.     machid_set = 1;
  55.     __MACHID = *id_ptr;
  56. }
  57.  
  58. echo()
  59. {
  60.     echoflag = 1;
  61. }
  62.  
  63. noecho()
  64. {
  65.     echoflag = 0;
  66. }
  67.  
  68. raw()
  69. {
  70.     rawflag = 1;
  71. }
  72.  
  73. noraw()
  74. {
  75.     rawflag = 0;
  76. }
  77.  
  78. crmode()
  79. {
  80. }
  81.  
  82. nocrmode()
  83. {
  84. }
  85.  
  86. nl()
  87. {
  88.     nlflag = 1;
  89. }
  90.  
  91. nonl()
  92. {
  93.     nlflag = 0;
  94. }
  95.  
  96. /* CHARACTER INPUT */
  97.  
  98. wgetch(win)
  99. WINDOW  *win;
  100. {
  101.     int c;
  102.  
  103.     c = kbgetc();
  104.  
  105.     if (!rawflag) {
  106.         if (c == '\r' && nlflag)
  107.             c = '\n';
  108.         if (echoflag) {
  109.             if (waddch(win, c) == ERR)
  110.                 return ERR;
  111.             wrefresh(win);
  112.         }
  113.     }
  114.  
  115.     return c;
  116. }
  117.  
  118. /* CHARACTER OUTPUT */
  119.  
  120. waddch(win, ch)
  121. WINDOW  *win;
  122. int     ch;
  123. {
  124.     int lry, lrx, cury, curx;
  125.  
  126.     getmaxrc(win, lry, lrx);
  127.     getyx(win, cury, curx);
  128.  
  129.     if (ch == '\b') {
  130.         if (curx > 0)
  131.             curx--;
  132.         else if (cury > 0 && (win->flags & _WWRAP)) {
  133.             curx = lrx;
  134.             cury--;
  135.         } else
  136.             return ERR;
  137.     } else if (ch == '\n') {
  138.         markwin(win);
  139.         wclrtoeol(win);
  140.         if (cury < lry) {
  141.             if (nlflag)
  142.                 curx = 0;
  143.             cury++;
  144.         } else if (win->flags & _WSCROLL) {
  145.             if (nlflag)
  146.                 curx = 0;
  147.             scroll(win);
  148.         } else
  149.             return ERR;
  150.     } else if (ch == '\r')
  151.         curx = 0;
  152.     else {
  153.         markwin(win);
  154.         if (curx <= lrx) {
  155.             win->buf[cury][curx].chr = ch;
  156.             win->buf[cury][curx].att = win->attrib;
  157.             curx++;
  158.             if ((win->flags & _WWRAP) && curx > lrx) {
  159.                 if (cury < lry) {
  160.                     curx = 0;
  161.                     cury++;
  162.                 } else if (win->flags & _WSCROLL) {
  163.                     curx = 0;
  164.                     scroll(win);
  165.                 }
  166.             }
  167.         } else
  168.             return ERR;
  169.     }
  170.  
  171.     win->cury = cury;
  172.     win->curx = curx;
  173.     if (ch != '\b')
  174.         markwin(win);
  175.  
  176.     return (ch & 0xff);
  177. }
  178.  
  179. /* POSITIONING WITHIN WINDOW */
  180.  
  181. wmove(win, r, c)
  182. WINDOW  *win;
  183. int     r, c;
  184. {
  185.     /* 
  186.         WARNING: this function intentionally does
  187.         no range checking on its arguments
  188.     */
  189.  
  190.     win->cury = r;
  191.     win->curx = c;
  192.     return OK;
  193. }
  194.  
  195. /* DISPLAY FATAL ERROR MESSAGE AND DIE */
  196.  
  197. void
  198. curses_fatal_error(char *fmt, ...)
  199. {
  200.     char    cbuf[150];
  201.     char    ubuf[100];
  202.     va_list ap;
  203.     
  204.     sprintf(cbuf, "Curses! v.%d.%d: ", CURSES_MAJOR_VERSION,
  205.         CURSES_MINOR_VERSION);
  206.  
  207.     va_start(ap, fmt);
  208.     vsprintf(ubuf, fmt, ap);
  209.     va_end(ap);
  210.  
  211.     strcat(cbuf, ubuf);
  212.     strcat(cbuf, "\n");
  213.  
  214.     fputs(cbuf, stderr);
  215.     exit(1);
  216. }
  217.  
  218. /* STARTUP FUNCTION */
  219.  
  220. static  VID_SCR_BUFF    *scr_save_ptr   =   NULL;
  221.  
  222. int
  223. initscr(void)
  224. {
  225. #if GET_TTY_FROM_ENV
  226.     char *termval;
  227. #endif    /* GET_TTY_FROM_ENV */
  228.     
  229.     __VIDADDR.longval = vid_buf_addr(__VIDMODE = vid_get_mode());
  230.     if (__VIDADDR.longval == 0L)
  231.         curses_fatal_error("can't use video mode %d", __VIDMODE);
  232.  
  233.     curscr = newwin(VID_MAX_ROWS, VID_MAX_COLS, 0, 0);
  234.  
  235.     if (curscr)
  236.         stdscr = newwin(0, 0, 0, 0);
  237.     else
  238.         return ERR;
  239.  
  240.     if (!stdscr) {
  241.         delwin(curscr);
  242.         return ERR;
  243.     }
  244.     
  245. #ifndef __GNUC__
  246.     if (!machid_set)
  247.         get_machine_id(&__MACHID);
  248. #endif
  249.  
  250.     _kb_init();
  251.     
  252. #if GET_TTY_FROM_ENV
  253.     termval = getenv("CURSES_TERM");
  254.     if (termval && !stricmp(termval, "BIOS"))
  255.         __USE_BIOS = 1;
  256. #endif  /* GET_TTY_FROM_ENV */
  257.     
  258.     if (scr_save_ptr = malloc(sizeof(VID_SCR_BUFF)))
  259.         vid_save_scr(scr_save_ptr);
  260.  
  261.     hidecursor();
  262.     undcursor();
  263.     showcursor();
  264.     refresh();
  265.  
  266.     return OK;
  267. }
  268.  
  269. /* SHUTDOWN FUNCTION */
  270.  
  271. endwin()
  272. {
  273.     delwin(stdscr);
  274.     delwin(curscr);
  275.     if (scr_save_ptr) {
  276.         vid_rest_scr(scr_save_ptr);
  277.         free(scr_save_ptr);
  278.     }
  279.     return OK;
  280. }
  281.